#!/usr/bin/env python
#encoding=utf-8
__author__ = 'Zhaokun'

""" wxPython实战 part 1 wxPython入门
2、给你的wxPython程序一个稳固的基础
"""

import wx
import sys
# wxPython程序有一个基础，它有两个必要的对象组成，对于支持你的应用程序的其余部分。
# 他们是应用程序对象和顶级窗口对象。

####################################################################
class TestFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        panel = wx.Panel(self) #创建画板
        button = wx.Button(panel, label='Close', pos=(125, 10),
                           size=(50, 50)) #将按钮添加到画板

class TestApp(wx.App):
    def __init__(self, redirect=True, filename=None):
        #redirect=True决定重定向
        #redirect为True时，可以设置filename，重定向到文件"filename='1.txt'"
        print 'App __init__'
        wx.App.__init__(self, redirect, filename)

    def OnInit(self):
        print "OnInit"
        self.frame = TestFrame(parent=None, id=-1, title='Startup',
#                               style=wx.DEFAULT_FRAME_STYLE ^
#                                     (wx.RESIZE_BORDER
#                                      | wx.MINIMIZE_BOX
#                                      | wx.MAXIMIZE_BOX))
        )
        print 'frame.id : %d' % self.frame.GetId()
        self.frame.Show()
        self.SetTopWindow(self.frame)
        print >> sys.stderr, "A pretend error message"
        return True

    def OnExit(self):
        print "OnExit"
        self.SetExitOnFrameDelete(False)

def TestMain():
    print 'test'
    app = TestApp()
    app.MainLoop()
    
############################################################
class InsertFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Frame With Button',
        size=(300, 100))
        panel = wx.Panel(self) #创建画板
        button = wx.Button(panel, label='Close', pos=(125, 10),
                           size=(50, 50)) #将按钮添加到画板
        #绑定按钮的单击事件
        self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)

        #绑定窗口的关闭事件
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
    def OnCloseMe(self, event):
        self.Close(True)
    def OnCloseWindow(self, event):
        self.Destroy()
def InsertMain():
    app = wx.PySimpleApp()
    frame = InsertFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()
###########################################################
#显示一个有菜单栏、工具栏和状态栏的框架
import sys
#images模块找不到，所以把下面路径加载进去
sys.path.append(r"C:\Python27\Lib\site-packages\wx-2.8-msw-unicode\wx\py")
import wx
import images

class ToolbarFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Toolbars',
                          size=(300, 200))
        panel = wx.Panel(self)
        panel.SetBackgroundColour('White')
        statusBar = self.CreateStatusBar() #1 创建状态栏
        toolBar = self.CreateToolBar() #2 创建工具栏
        toolBar.AddSimpleTool(wx.NewId(), images.getPyBitmap(),
                              'New', "Long help for 'New'")
#        toolBar.AddSimpleTool
        #3 给工具栏增加一个工具
        toolBar.Realize() #4 准备显示工具栏
        menuBar = wx.MenuBar() # 创建菜单栏
        #5 创建2个菜单
        menu1 = wx.Menu()
        menuBar.Append(menu1, '&File')
        menu2 = wx.Menu()
        menuBar.Append(menu2, '&Edit') # 在菜单栏上附加菜单
        menu3 = wx.Menu()
        menuBar.Append(menu3, 'msg')
        #6 创建菜单的项目
        menu1.Append(wx.NewId(), '&Open', 'Open File')
        menu2.Append(wx.NewId(), '&Copy', 'Copy in status bar')
        menu2.Append(wx.NewId(), 'C&ut', '')
        menu2.Append(wx.NewId(), 'Paste', '')
        menu2.AppendSeparator()
        menu2.Append(wx.NewId(), '&Options...', 'Display Options')

        msgYESNO = menu3.Append(wx.NewId(), 'Show YesNo Msg')
        msgEdit = menu3.Append(wx.NewId(), 'Show Edit Msg')
        msgListChoice = menu3.Append(wx.NewId(), 'Show List Choice')
        self.Bind(wx.EVT_MENU, self.OnShowYesNo, msgYESNO)
        self.Bind(wx.EVT_MENU, self.OnShowEdit, msgEdit)
        self.Bind(wx.EVT_MENU, self.OnShowListDlg, msgListChoice)

        self.SetMenuBar(menuBar) #在框架上附上菜单栏

                
    def OnShowYesNo(self, event):
        dlg = wx.MessageDialog(self, 'Is this the coolest thing ever!',
                               'MessageDlg', wx.YES_NO | wx.ICON_QUESTION)
        result = dlg.ShowModal()
        dlg.Destroy()
    def OnShowEdit(self, event):
        dlg = wx.TextEntryDialog(self, "What's your name?",
                                 'A Question', 'CaryGrant')
        if dlg.ShowModal() == wx.ID_OK:
            name = dlg.GetValue()
            print name
    def OnShowListDlg(self, event):
        dlg = wx.SingleChoiceDialog(self,
                                    'What version of Python are you using?',
                                    'Single Choice',
                                    ['1.5.2', '2.0', '2.1.3', '2.2'])
        if dlg.ShowModal() == wx.ID_OK:
            index = dlg.GetSelection()
            version = dlg.GetStringSelection()
            print '[%d]' % index, version

class ToolbarApp(wx.App):
    def __init__(self, redirect=False):
        wx.App.__init__(self, redirect)
    def OnInit(self):
        frame = ToolbarFrame(parent=None, id=-1)
        frame.Show()
        return True
def ToolbarMain():
#    app = wx.PySimpleApp()
#    frame = ToolbarFrame(parent=None, id=-1)
#    frame.Show()
    app = ToolbarApp()
    app.MainLoop()

    
if __name__ == '__main__':
    ToolbarMain()
#    InsertMain()
#    TestMain()

"""总结
1、wxPython程序的实现基于两个必要的对象：应用程序对象和顶级窗
口。任何wxPython应用程序都需要去实例化一个wx.App，并且至少有一个顶级
窗口。
2、应用程序对象包含OnInit()方法，它在启动时被调用。在这个方法中，
通常要初始化框架和别的全局对象。wxPython应用程序通常在它的所有的顶级
窗口被关闭或主事件循环退出时结束。
3、应用程序对象也控制wxPython文本输出的位置。默认情况
下，wxPython重定向stdout和stderr到一个特定的窗口。这个行为使得诊断启动
时产生的错误变得困难了。但是我们可以通过让wxPython把错误消息发送到一
个文件或控制台窗口来解决。
49 / 565
4、一个wxPython应用程序通常至少有一个wx.Frame的子类。一个
wx.Frame对象可以使用style参数来创建组合的样式。每个wxWidget对象，包括
框架，都有一个ID，这个ID可以被应用程序显式地赋值或由wxPython生成。子
窗口是框架的内容，框架是它的双亲。通常，一个框架包含一个单一的
wx.Panel，更多的子窗口被放置在这个Panel中。框架的唯一的子窗口的尺寸自
动随其父框架的尺寸的改变而改变。框架有明确的关于管理菜单栏、工具栏和
状态栏的机制。
5、尽管你将使用框架做任何复杂的事情，但当你想简单而快速地得到来
自用户的信息时，你可以给用户显示一个标准的对话窗口。对于很多任务都有
标准的对话框，包括警告框、简单的文本输入框和列表选择框等等。
"""